perm filename TRONLY.F4[PAG,LCS]2 blob sn#493288 filedate 1980-01-14 generic text, type T, neo UTF8
00100	C******** TRONLY, ZSIG, AVERG *********************************
00200	
00300		SUBROUTINE TRONLY
00500		COMMON /PX/KPN(1) /Q/Q(1) /XRN/RN(1) /PTR/JST(1)
00600	 	1 /RCLF/KK,CLEF,KW,KTEM,RSTAFF,SN,YN,RNAM,IRV,ITR
00700		1 /IPG/IPG,JPG,XCLEF,RSTNUM(8),RPSZ(8),RHGT(8),RRCLEF(8)
00800		1 /ITX/ITX(18)
00900		1 /TRAN/RTR(17),KTR(17)
00910		EQUIVALENCE (ITEM,JST(18)),(ITOT,JST(19))
01000	1000	FORMAT(' TYPE INPUT NAME.EXT   ',$)
01100	2200	FORMAT(A5,A1,A3)
01200	2201	FORMAT(1XA5,'.',A3)
01300	400	FORMAT(' OUTPUT NAME.EXT   ',$)
01400	6	FORMAT(' WRITE OVER ',A5,'.',A3,'?  ',$)
01500	8	FORMAT(A1)
01600	304	FORMAT(' TRANSP.= '$)
01700	306	FORMAT(I)
01800		IDONE=0
01900		SIG=-99
02000		XSIG=0
02100	300	TYPE 1000
02200		ACCEPT 2200,NM,XIN,XIN
02300		IF(XIN.EQ.' ')XIN='MS'
02400		NX=NM+256
02500	2001	TYPE 304
02600		ACCEPT 2101,ITR
02700		IF(ITR.GT.-20)GO TO 1101
02800	2101	FORMAT(A3)
02900	C  NEXT FOR LETTER NAMES 
03000		DO 3101 K=1,18
03100	3101	IF(ITR.EQ.ITX(K))GO TO 4101
03200	5101	TYPE 240
03300		GO TO 2001
03400	240	FORMAT(' THIS TRANSP NOT OFFERED')
03500	1101	REREAD 306,ITR
03600		IF(ITR.EQ.0)GO TO 300
03700		ITR=10-ITR
03800		IF(ITR.EQ.22)ITR=17
03900	C FOR DOWN OCT.
04000		IF(ITR.GT.0)GO TO 700
04100		IF(ITR.EQ.-2)ITR=18
04200	C  -2 NOW = UP OCT.
04300		GO TO 700
04400	4101	ITR=K
04500		
04600	700	TYPE 400
04700		ACCEPT 2200,NOUT,K,XOUT
04800		IF(NOUT.NE.' ')GO TO 5
04900		NOUT='AAAAA'
05000		XOUT='TST'
05100	C DEFAULT NAMES
05200	5	IF(XOUT.EQ.' ')XOUT='TST'
05300		IF(LOOKX(NOUT,XOUT).GE.0)GO TO 11
05400		TYPE 6,NOUT,XOUT
05500		ACCEPT 8,K
05600		IF(K.EQ.'N')GO TO 700
05700	11	JOUT=NOUT+256
05800	10	IF(LOOKX(NM,XIN).LT.0)GO TO 9
05900		NM=NX
06000		NX=NX+256
06100	C  WILL READ UP TO 52 FILES.
06200		NOUT=JOUT
06300		JOUT=JOUT+256
06400		IF(LOOKX(NM,XIN).LT.0)GO TO 9
06500		IF(IDONE.EQ.0)TYPE 290
06600		CALL EXIT
06700	290	FORMAT(
06800		1' **** FILE NOT FOUND.  NAMES MUST HAVE 5 LETTERS.****')
06900	9	IDONE=-1
07000		CALL GETEXT(NM,XIN)
07100		CALL EXTIN(JST,128)
07200		CALL EXTIN(KPN,ITEM)
07300		CALL EXTIN(Q,ITOT)
07400		TYPE 2201,NM,XIN
07500		ITEM=ITEM-2
07600	
07700	C  NEXT SORTS INTO LEFT-TO-RIGHT
07800		KL=1
07900		JPG=ITEM-1
08000	333	DO 33 K=KL,JPG 
08100		IF(CODEN(KPN,K,Q,J).GT.6)GO TO 33
08200		A=Q(J+3)
08300		DO 3333 J=K+1,JPG
08400		IF(CODEN(KPN,J,Q,L).GT.6)GO TO 3333
08500		IF(A.LE.Q(L+3))GO TO 3333
08600		CALL EXCH(KPN(J),KPN(K))
08700	CC	KL=J-1
08800		GO TO 333
08900	3333	CONTINUE
09000		KL=K+1
09100	33	CONTINUE
09200	
09300	C NEXT FIND HOW MANY STAVES.  KSIG?
09400		RS=0
09500		DO 32 K=1,ITEM
09600		R=CODEN(KPN,K,Q,J)
09700		IF(R.GT.2)GO TO 32
09800		IF(Q(J+2).GT.RS)RS=Q(J+2)
09900	32	IF(R.EQ.17)SIG=0
10000		JPG=RS+1
10100		JITEM=ITEM
10200	
10300		IOCT=0
10400		KW=0
10500		IF(ITR.LE.17)GO TO 1002
10600		RT=7
10700	C OCTAVE ↑ = 19,  - = 18
10800		IF(ITR.EQ.18)RT=-RT  
10900		IOCT=-1
11000		GO TO 199
11100	C  FOUND KSIG, SO DON'T DO THE REST
11200	1002	IF(XSIG.NE.0)GO TO 199 
11300		RT=0
11400		IF(ITR.EQ.0)RETURN
11500		RT=RTR(ITR)
11600	C  EEb,EE,F-,F#-,G,  Ab,A,Bb,B,DMY,  Db,D,Eb,E,F,G↑  BBb, 8-, 8↑
11700	41	NSIG=-1
11800		IF(SIG.EQ.0)GO TO 699
11900	C  ASSUMES KSIG DESIRED IF ONE THERE ALREADY.
12000		RSIG=-1
12100		IF(ZSIG(XSIG).NE.'Y')GO TO 199
12200	C FUNCTION ZSIG ASKS 'ADD KEY SIG?'
12300	699	NSIG=0
12400		RSIG=0
12500		XSIG=99
12600	
12700	C  ***** NEXT FOR KEY SIG. ********
12800		IADD=KTR(ITR)
12900	C  ADD= ADD OR SUBTR. # OR b  FROM KSIG.
13000	C  EEb,EE,F-,F#-,G,  Ab,A,Bb,B,DMY,  Db,D,Eb,E,F,G  BBb, 8-, 8↑
13100	199	K=1
13200		XCLEF=0
13300		CLEF=-1
13400	CC	RSIG=0
13500		SLUR=0
13600		PRX=99
13700		MS=1
13800		SN=KW
13900	599	X=CODEN(KPN,K,Q,J)
14000		IF(X.NE.4)GO TO 2
14100		BAR=-1
14200		MS=1  
14300		GO TO 100
14400	2	IF(Q(J+2).NE.SN)GO TO 100
14500	CHECK FOR STAFF NUM.
14600		IF(X.EQ.1)GO TO 1
14700	20	IF(X.NE.17)GO TO 12
14800		RSIG=-1
14900		R=Q(J+5)
15000	C KSIG NUM.
15100		A=R+IADD
15200	CHANGED TO A
15300		IF(ABS(A).LT.8)GO TO 123
15400	C AVOIDS IMPOSSIBLE KSIG, DOES ENHARMONIC CHANGE.
15500		IF(A.LT.0)GO TO 223
15600		ITR=9
15700		A=A-12
15800		RT=RT+1
15900		GO TO 123
16000	223	A=A+12
16100		ITR=11
16200		RT=RT-1
16300	123	IF(A.NE.0)GO TO 23
16400		M=Q(J)+3
16500	C THIS WILL DELETE KSIG
16600		ITOT=ITOT-M
16700		KL=ITOT-J
16800		CALL RLOOP(Q(J),Q(J+M),KL)
16900		DO 334 J=K,JITEM
17000	334	KPN(J)=KPN(J+1)-M
17100		JITEM=JITEM-1
17200		K=K-1
17300		GO TO 100
17400	23	Q(J+5)=A
17500		NSIG=0
17600	12	IF(X.EQ.5)GO TO 120
17700		IF(X.NE.3)GO TO 26
17800		IF(Q(J+5).GT.3)GO TO 100
17900	C SKIP NON-CLEFS
18000		IF(CLEF.GE.0)GO TO 100
18100	C FINDS ONLY 1 CLEF PER STAFF
18200	        XCLEF=Q(J+5)
18300		IF(Q(J).LT.3)XCLEF=0
18400		CLEF=0
18500		GO TO 100
18600	26	IF(X.NE.6)GO TO 100
18700	120	IF(RT.NE.8)GO TO 121
18800		IF(XCLEF.EQ.1)RT=-4
18900	C  WHAT ABOUT C CLEFS??
19000	121	Q(J+4)=Q(J+4)+RT
19100		Q(J+5)=Q(J+5)+RT
19200		IF(X.EQ.5)SLUR=Q(J+6)
19300	C  SAVES RIGHT POS. OF SLUR
19400		GO TO 100
19500	C  FOR BEAMS AND SLURS
19600	
19700	1	R=Q(J+4)
19800		XRT=RT
19900		IF(Q(J).LT.6)GO TO 111
20000	C SKIP IF NO STEM INFO
20100		RX=Q(J+8)
20200		IF(RX.GT.999.0)GO TO 111
20300		IF(RX.EQ.999.0)RX=0     
20400		RX=RX+RT
20500		IF(RX.LT.0)RX=0
20600	C RESET STEM LENGTH.  NEVER SHORTER THAN 0 (NORMAL).
20700		Q(J+8)=RX
20800	111	IF(IOCT.LT.0)GO TO 4
20900	C  IOCT=-1 FOR OCT+ OR OCT- 
21000		RX=AMOD(R,100.0)
21100		RZ=AMOD(RX,7.0)
21200	C  THE NOTE NUM
21300		IF(RZ.LT.0)RZ=RZ+7
21400	C  PUTS IT IN 0-6 RANGE FOR ACCI CHANGE SECTION.
21500		R5=Q(J+5)
21600		A=AMOD(R5,10.0)
21700	C  THE ACCI
21800		RN(MS)=A
21900		RN(MS+1)=RX
22000	C  SAVE FOR REPEATS
22100		MS=MS+2
22200		CHNAT=3
22300		IF(MS.LT.4)GO TO 205
22400		N=MS-3
22500	200	IF(RX.NE.RN(N))GO TO 201
22600		IF(A.EQ.0)GO TO 4
22700	C  NOW WE'VE FOUND THE SAME NOTE WITH NO ACCI IN SAME MEAS.
22800		GO TO 203
22900	201	N=N-2
23000		IF(N.GE.1)GO TO 200
23100	205	IF(NSIG.LT.0)CHNAT=0
23200	203	ADD=A
23300	C  THE CHANGE IN ACCI
23400		IF(PRX.NE.RX)GO TO 44
23500	C IF PREV ACCI AND NT ARE SAME, SKIP OVER.
23600		IF(A.NE.0)GO TO 44
23700	C NOW SAME NOTE, NO ACCI
23800		IF(ABS(SLUR-Q(J+3)).GT.3)GO TO 44
23900	C  FOUND CONNECTING TIE
24000	C OR SET MS BACK TO 200 WHEN TIE IS PRESENT.  THIS WILL
24100	CAUSE LATER SAME NOTE TO HAVE ACCI (I HOPE.)
24200		IF(BAR.LT.0)MS=1  
24300		IF(A.NE.0)GO TO 203
24400		GO TO 4
24500	44	IF(NSIG.LT.0)GO TO 440
24600	CCC	IF(ITR.GE.17)GO TO 69
24700		IF(A.EQ.0)GO TO 4
24800	C  ONLY CHECKS ON NOTES WITH NO ACCI
24900	   	IF(ITR.GE.18)GO TO 4
25000	
25100	440	IF(XCLEF.NE.1)GO TO 69
25200		RZ=RZ-5
25300		IF(RZ.LT.0)RZ=RZ+7
25400	69	N=A+1
25500		GO TO (63,52,53,54,55, 56,57,58,59,440, 61,62,63,52,53,55
25600		1 ,64),ITR
25700	C  EEb,EE,F-,F#-,G,  Ab,A,Bb,B,DMY,  Db,D,Eb,E,F  BBb
25800	54	IF(RZ.EQ.3)GO TO 101
25900	59	IF(RZ.EQ.6)GO TO 101
26000	52	IF(RZ.EQ.2)GO TO 101
26100	57	IF(RZ.EQ.5)GO TO 101
26200	C  FOR "A".  FINDS C,F AND G.
26300	62	IF(RZ.EQ.1)GO TO 101
26400	55	IF(RZ.EQ.4)GO TO 101
26500	C  "G"   F→Bb, F#→B NAT.
26600		GO TO 4
26700	61	IF(RZ.EQ.5)GO TO 7
26800	56	IF(RZ.EQ.2)GO TO 7
26900	63	IF(RZ.EQ.6)GO TO 7
27000	58	IF(RZ.EQ.3)GO TO 7
27100	53	IF(RZ.NE.0)GO TO 4
27200		
27300	7	GO TO(402,30,405,402,401)N
27400	CIRC7	IF(A.EQ.0)GO TO 402
27500	CIRC	IF(A.EQ.3)GO TO 402
27600	C  CHNG NO ACCI OR NAT TO SHARP
27700	CIRC	IF(A.EQ.4)GO TO 401
27800	C 4=bb   5=##
27900	CIRC	IF(A.EQ.2)GO TO 405
28000	30	ADD=CHNAT
28100	C  MAKE IT NAT. IF NEEDED
28200	3	Q(J+5)=R5-A+ADD
28300	4	PRX=RX
28400	C  REAL NOTE LEVEL
28500		Q(J+4)=R+XRT
28600		BAR=0
28700	100	IF(K.GE.JITEM)GO TO 499
28800		K=K+1
28900		GO TO 599
29000	
29100	
29200	C NEXT FOR BSCLAR.---ADD OTHERS HERE!!!
29300	64	IF(XCLEF.EQ.1)XRT=XRT-12
29400		GO TO 58
29500	
29600	101	GO TO(401,404,30,401,404,402)N
29700	CIRC101	IF(A.EQ.0)GO TO 401
29800	CIRC	IF(A.EQ.2)GO TO 30
29900	CIRC	IF(A.EQ.3)GO TO 401
30000	CIRC	IF(A.EQ.5)GO TO 402
30100	C  WON'T HANDLE Gbb→Ab
30200	404	ADD=4
30300		GO TO 3
30400	401	ADD=1
30500		GO TO 3
30600	
30700	402	ADD=2
30800		GO TO 3
30900	405	ADD=5
31000		GO TO 3
31100	499	KW=KW+1
31200		IF(RSIG.LT.0)GO TO 498
31300		IF(IADD.EQ.0)GO TO 498
31400		M=ITOT  
31500	C INSERT NEW KSIG
31600		Q(M)=4
31700		Q(M+1)=17
31800		Q(M+2)=SN
31900		Q(M+3)=9 
32000		Q(M+4)=0 
32100		Q(M+5)=IADD
32200		Q(M+6)=XCLEF
32300		ITOT=ITOT+7
32400		JITEM=JITEM+1
32500		KPN(JITEM+1)=ITOT
32600	498	IF(KW.LT.JPG)GO TO 199
32700		CALL RVRS(JITEM)
32800	C  TO REVERSE STEMS, BEAMS AND SLURS
32900	497	DO 496 K=1,ITEM-1
33000	C THIS REORDERS PTR ARRAY
33100		IF(KPN(K).LT.KPN(K+1))GO TO 496
33200		CALL EXCH(KPN(K),KPN(K+1))
33300		GO TO 497
33400	496	CONTINUE
33500		CALL PUTEXT(NOUT,XOUT)
33600		ITEM=JITEM+2
33700		CALL EXTOUT(JST,128)
33800		CALL EXTOUT(KPN,ITEM)
33900		CALL EXTOUT(Q,ITOT)
34000		CALL FINEXT
34100		TYPE 2201,NOUT,XOUT
34200		NOUT=NOUT+2
34300		NM=NM+2
34400		GO TO 10
34500		END
34600	
34700		FUNCTION ZSIG(XSIG)
34800		TYPE 42
34900	42	FORMAT(' ADD KEY SIG? -- ',$)
35000	43	FORMAT(A1)
35100		ACCEPT 43,XSIG
35200		ZSIG=XSIG
35300		END
35400	
35500		FUNCTION AVERG(J,JJ,LEND)
35600		COMMON /PX/KPN(1) /Q/Q(1) /XRN/RN(1)
35700	 	1 /RCLF/KK,CLEF,KW,ITEM,RSTAFF,SN,YN,RNAM,IRV,ITR
35800		1 /IPG/IPG,JPG,BRA(8),RSTNUM(8),RPSZ(8),RHGT(8),RCLEF(8)
35900	 
36000	C FIRST GET RIGHT END POSITION OF BEAM
36100		END=Q(JJ+6)+.2
36200		LL=Q(JJ+7)/10.
36300	C STEM DIRECTION OF BEAM
36400		BOT=999.
36500		TOP=-BOT
36600		AVERG=0
36700		K=J
36800	1	R=CODEN(KPN,K,Q,KK)
36900	C FIND CODE NUM.
37000		IF(Q(KK+3).GT.END)GO TO 3
37100	C JUMP OUT IF PAST RIGHT SIDE OF BEAM
37200		IF(R.NE.1)GO TO 2
37300	C JUMP IF NOT A NOTE
37400		IF(Q(KK+2).NE.SN)GO TO 2
37500	C JUMP IF NOT ON RIGHT STAFF
37600		L=Q(KK+5)/10.
37700		IF(L.NE.LL)GO TO 4
37800	C JUMP OUT IF ANY NOTE HAS WRONG STEM DIRECTION.
37900		A=AMOD(Q(KK+4),100.0)
38000	C GET HEIGHT OF NOTE
38100		IF(A.LT.BOT)BOT=A
38200		IF(A.GT.TOP)TOP=A
38300	2	K=K+1
38400		IF(K.GT.LEND)GO TO 4
38500	C IF AT END OF DATA, JUMP OUT (SHOULD NOT GET HERE!)
38600		GO TO 1
38700	3	A=(TOP+BOT)/2.
38800	C AVERG=0=STEMS SHOULD GO UP, 1=DOWN
38900		IF(A.GE.7)AVERG=1.
39000		RETURN
39100	4	IF(LL.EQ.2)AVERG=1.
39200	C USE STEM DIR. OF BEAM IF NOTES HAVE VARYING STEMS.
39300		END